package cn.tedu.store.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class DemoAop {
	//前置通知：在执行业务逻辑之前执行的切面方法
	@Before("bean(userService)")
	public void test1(){
		System.out.println("执行方法之前。。。");
	}	
	//后置通知：在执行业务逻辑之后执行的切面方法
	//不管发不发生异常，都会执行
	@After("bean(userService)")
	public void test2(){
		System.out.println("执行方法之后。。。");
	}
	//后置通知：在执行业务逻辑之后执行的切面方法
	//业务逻辑方法不发生异常，才会执行
	@AfterReturning("bean(userService)")
	public void test3(){
		System.out.println("执行方法之后。。。Returning");
	}
	//业务逻辑方法发生异常时，执行
	@AfterThrowing("bean(userService)")
	public void test4(){
		System.out.println("发生异常。。。");
	}
	//环绕通知：就是在业务方法之前，
	//之后都可以执行切面逻辑
	//注意：1：必须有返回值
	//     2：必须定义参数ProceedingJoinPoint
	//     3：pd.proceed();返回方法的返回值
	@Around("bean(userService)")
	public Object test5(ProceedingJoinPoint pd) 
			throws Throwable{
		//获取系统时间的方法
		//System.currentTimeMillis()
		System.out.println("环绕通知前。。。。");
		//执行业务逻辑方法
		Object obj = pd.proceed();
		System.out.println("环绕通知后。。。。");
		return obj;
	}
	
}






